package com.qiguliuxing.dts.db.handle;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.qiguliuxing.dts.common.type.OrderStatusEnum;
import com.qiguliuxing.dts.db.domain.DtsOrder;
import com.qiguliuxing.dts.db.domain.DtsOrderGoods;

/*
 * 订单流程：下单成功－》支付订单－》发货－》收货
 * 订单状态：
 * 101 订单生成，未支付；
 * 102，下单未支付用户取消；
 * 103，下单未支付超期系统自动取消
 * 201 支付完成，商家未发货；
 * 202，订单生产，已付款未发货，用户申请退款；
 * 203，管理员执行退款操作，确认退款成功；
 * 204，团购订单，正在团购中(团人数未满)...
 * 205  订单赠予中...
 * 301 商家发货，用户未确认；
 * 401 用户确认收货，订单结束；
 * 402 用户没有确认收货，但是快递反馈已收获后，超过一定时间，系统自动确认收货，订单结束。
 *
 * 当101用户未付款时，此时用户可以进行的操作是取消或者付款
 * 当201支付完成而商家未发货时，此时用户可以退款
 * 当301商家已发货时，此时用户可以有确认收货
 * 当401用户确认收货以后，此时用户可以进行的操作是退货、删除、去评价或者再次购买
 * 当402系统自动确认收货以后，此时用户可以删除、去评价、或者再次购买
 */
public class OrderHandler {

	public static String orderStatusText(DtsOrder order) {
		OrderStatusEnum orderStatus = OrderStatusEnum.getInstance(order.getOrderStatus());
		if (orderStatus == null) {
			throw new IllegalStateException("orderStatus不支持");
		}
		return orderStatus.desc;
	}

	public static OrderOperator build(DtsOrder order) {
		short status = order.getOrderStatus();
		OrderOperator handleOption = new OrderOperator();


		if (status == OrderStatusEnum.CREATE.status) {
			// 如果订单没有被取消，且没有支付，则可支付，可取消
			handleOption.setCancel(true);
			handleOption.setPay(true);
		} else if (status == OrderStatusEnum.CANCEL.status || status == OrderStatusEnum.AUTO_CANCEL.status) {
			// 如果订单已经取消或是系统取消，则可删除
			handleOption.setDelete(true);
		} else if (status == OrderStatusEnum.PAY.status) {
			// 如果订单已付款，没有发货，则可退款
			handleOption.setRefund(true);
			if (order.getFreightType().intValue() == 1){ //自提订单,已付款则可直接进入确认收货，可以进行赠予发送
				handleOption.setConfirm(true);
				if (order.getGiftReceiveTime() == null) {
					handleOption.setGiftSend(true);//自提且未接收则可继续赠予
				}
			}
		} else if (status == OrderStatusEnum.REFUND.status) { //只有订单中所有商品都申请退货，才能更改为退货中...
			//此情况不能再退货申请...
		} else if (status == OrderStatusEnum.REFUND_CONFIRM.status) { //已退款必须验证该订单所有商品都已经退货才可以设置
			// 如果订单已经退款，则可删除
			handleOption.setDelete(true);
		} else if (status == OrderStatusEnum.GROUPON_ING.status) { //团购中的订单 可以退款
			handleOption.setRefund(true);
		}  else if (status == OrderStatusEnum.GIFT_ING.status) { //赠予中的订单 可以退款,可以继续赠予,可以赠予接收
			handleOption.setRefund(true);
			if (order.getFreightType().intValue() == 1) { //自提订单
				if (order.getGiftReceiveTime() == null) {
					handleOption.setGiftSend(true); //自提且未接收则可继续赠予
				}
				handleOption.setGiftRecive(true);
				handleOption.setConfirm(true);
			}
		} else if (status == OrderStatusEnum.SHIP.status) { //如果该订单中所有的商品都已经申请退货，则不能操作发货
			// 如果订单已经发货，没有收货，则可确认收货操作和退款操作, 此时不能取消订单
			handleOption.setRefund(true);
			handleOption.setConfirm(true);
		} else if (status == OrderStatusEnum.CONFIRM.status || status == OrderStatusEnum.AUTO_CONFIRM.status) {
			// 如果订单已经支付，且已经收货，则可删除、去评论和再次购买
			handleOption.setRefund(true);
			handleOption.setDelete(true);
			handleOption.setComment(true);
			handleOption.setRebuy(true);
		} else {
			throw new IllegalStateException("status不支持");
		}

		return handleOption;
	}

	public static List<Short> orderStatus(Integer showType) {
		// 全部订单
		if (showType == 0) {
			return null;
		}

		List<Short> status = new ArrayList<Short>(2);

		if (showType.equals(1)) {
			// 待付款订单
			status.add(OrderStatusEnum.CREATE.status);
		} else if (showType.equals(2)) {
			// 待发货订单 可以查已付款，团购中 和 赠予中的订单
			status.add(OrderStatusEnum.PAY.status);
			status.add(OrderStatusEnum.GROUPON_ING.status);
			status.add(OrderStatusEnum.GIFT_ING.status);
		} else if (showType.equals(3)) {
			// 待收货订单
			status.add(OrderStatusEnum.SHIP.status);
		} else if (showType.equals(4)) {
			// 待评价订单
			status.add(OrderStatusEnum.CONFIRM.status);
			// 系统超时自动取消，此时应该不支持评价
			// status.add(OrderStatusEnum.AUTO_CONFIRM.status);
		}else if (showType.equals(5)) {
			// 待评价订单
			status.add(OrderStatusEnum.REFUND_CONFIRM.status);
			status.add(OrderStatusEnum.REFUND.status);
			// 系统超时自动取消，此时应该不支持评价
			// status.add(OrderStatusEnum.AUTO_CONFIRM.status);
		} else {
			return null;
		}

		return status;
	}

	public static boolean isCreateStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.CREATE.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isPayStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.PAY.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isShipStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.SHIP.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isConfirmStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.CONFIRM.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isCancelStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.CANCEL.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isAutoCancelStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.AUTO_CANCEL.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isRefundStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.REFUND.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isRefundConfirmStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.REFUND_CONFIRM.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	public static boolean isAutoConfirmStatus(DtsOrder dtsOrder) {
		return OrderStatusEnum.AUTO_CONFIRM.status.shortValue() == dtsOrder.getOrderStatus().shortValue();
	}

	/**
	 * 0，全部订单； 1，有效订单； 2，失效订单； 3，结算订单； 4，待结算订单。
	 *
	 * @param showType
	 * @return
	 */
	public static List<Short> settleOrderStatus(Integer showType) {
		// 全部订单
		if (showType == 0) {
			return null;
		}

		List<Short> status = new ArrayList<Short>();

		if (showType.equals(1)) {
			// 已经付款，且后续流程正常无退款
			status.add(OrderStatusEnum.PAY.status);
			status.add(OrderStatusEnum.GROUPON_ING.status);
			status.add(OrderStatusEnum.GIFT_ING.status);
			status.add(OrderStatusEnum.SHIP.status);
			status.add(OrderStatusEnum.CONFIRM.status);
			status.add(OrderStatusEnum.AUTO_CONFIRM.status);
		} else if (showType.equals(2)) {
			// 失效订单，取消或退款，退款成功都失效
			status.add(OrderStatusEnum.CREATE.status);
			status.add(OrderStatusEnum.CANCEL.status);
			status.add(OrderStatusEnum.AUTO_CANCEL.status);
			status.add(OrderStatusEnum.REFUND.status);
			status.add(OrderStatusEnum.REFUND_CONFIRM.status);
		} else if (showType.equals(3)) {
			// 结算订单 订单完成
			status.add(OrderStatusEnum.CONFIRM.status);
			status.add(OrderStatusEnum.AUTO_CONFIRM.status);
		} else if (showType.equals(4)) {
			// 待结算订单 订单完成
			status.add(OrderStatusEnum.CONFIRM.status);
			status.add(OrderStatusEnum.AUTO_CONFIRM.status);
		} else {
			return null;
		}

		return status;
	}

	/**
	 * 0，全部订单； 1，有效订单； 2，失效订单； 3，结算订单； 4，待结算订单。
	 *
	 * @param showType
	 * @return
	 */
	public static List<Short> settlementStatus(Integer showType) {
		if (showType == 0 || showType == 1 || showType == 2) {
			return null;
		}

		List<Short> settlementStatus = new ArrayList<Short>();
		if (showType.equals(3)) {
			// 结算订单
			settlementStatus.add((short) 0);
		} else if (showType.equals(4)) {
			// 待结算订单
			settlementStatus.add((short) 1);
		} else {
			return null;
		}
		return settlementStatus;
	}

	public static String orderHtmlText(DtsOrder order, String orderIds, List<DtsOrderGoods> orderGoodsList) {
		String orderStr = "";
		if (orderGoodsList == null || orderGoodsList.size() < 1) {// 无商品时，设置商品信息为null
			orderStr = null;
		} else {
			for (DtsOrderGoods dog : orderGoodsList) {
				orderStr = orderStr
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品序列码" + "【" + dog.getGoodsSn() + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品名称" + "【" + dog.getGoodsName() + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品规格" + "【" + JSONObject.toJSONString(dog.getSpecifications()) + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品规格数量" + "【" + dog.getNumber() + "】<br>";
			}
		}

		StringBuilder sb = new StringBuilder();
		sb.append("<br>订单编号：").append(order.getOrderSn());
		sb.append("<br>订单ID:").append(orderIds);
		if (orderStr != null) {
			sb.append("<br>订购商品：").append(orderStr);
		}
		sb.append("<br>订单状态：").append(orderStatusText(order));
		sb.append("<br>收货人：").append(order.getConsignee());
		sb.append("<br>收货人手机号：").append(order.getMobile());
		sb.append("<br>收货地址：").append(order.getAddress());
		sb.append("<br>用户订单留言：").append(order.getMessage());
		sb.append("<br>微信付款时间：").append(order.getPayTime());
		return sb.toString();
	}

	public static String orderHtmlText(List<DtsOrderGoods> orderGoodsList) {
		String orderStr = "";
		if (orderGoodsList == null || orderGoodsList.size() < 1) {// 无商品时，设置商品信息为null
			orderStr = null;
		} else {
			for (DtsOrderGoods dog : orderGoodsList) {
				orderStr = orderStr
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品序列码" + "【" + dog.getGoodsSn() + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品名称" + "【" + dog.getGoodsName() + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品规格" + "【" + JSONObject.toJSONString(dog.getSpecifications()) + "】;"
						+ "<br>&nbsp;&nbsp;&nbsp;&nbsp;商品规格数量" + "【" + dog.getNumber() + "】<br>";
			}
		}

		StringBuilder sb = new StringBuilder();
		if (orderStr != null) {
			sb.append("<br>订购商品：").append(orderStr);
		}
		return sb.toString();
	}
}
